package controllers.role;

import hprose.HproseClinetService;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang.StringUtils;

import play.Logger;
import utils.convert.Convert;
import utils.date.DateUtils;
import utils.json.JSONUtils;
import utils.logs.LogsUtils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.sun.xml.bind.v2.runtime.unmarshaller.XsiNilLoader.Array;

import component.UserBis;
import constants.APIConstants;
import constants.Constants;
import controllers.common.filter.BaseFilter;
/**
 * 角色管理
 * 2016年1月22日 上午10:03:29
 * @author huan208050@vip.qq.com
 */
public class RoleManageAction extends BaseFilter {
	/**
	 * 进入角色管理主页
	 * 
	 * 2016年1月22日 上午10:03:48
	 * @auth huan208050@vip.qq.com
	 */
	public static void index(){
		render();
	}
	/**
	 * 获取角色列表
	 * 
	 * 2016年1月22日 上午10:15:56
	 * @auth huan208050@vip.qq.com
	 */
	public static void getRolesList(){
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("customer_id", UserBis.currUser());
		map.put("operator_id", UserBis.currOperatorId());
		map.put("plat_id", UserBis.currPlatId());
		Object[] arguments = new Object[]{map};
		String ret = HproseClinetService.synCall(APIConstants.ROLEMI_GETTOLESBYPLATID, arguments,APIConstants.AUTH_HOST, APIConstants.AUTH_PORT);
		if("服务不可用".equals(ret)){
			renderJSON("");
		}else{
			JSONObject json = JSONObject.parseObject(ret);
			String data = json.getString("data");
			JSONObject rd = JSONObject.parseObject(data);
			String role_data_str = rd.getString("role_data");
			renderJSON(role_data_str);
		}
	}
	/**
	 * 获取权限列表
	 * 
	 * 2016年1月22日 上午10:34:58
	 * @auth huan208050@vip.qq.com
	 */
	public static void getRightsList(){
		JSONArray ja = new JSONArray();
		JSONObject json1 = new JSONObject();
		JSONObject json2 = new JSONObject();
		json1.put("leve", "leve1");
		json1.put("permissions", "服务不可用");
		json1.put("open", "true");
		json1.put("checkbox", 1);
		
		ja.add(json1);
		ja.add(json2);
		
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("operator_id", UserBis.currOperatorId());
		map.put("plat_id", UserBis.currPlatId());
		Object[] arguments = new Object[]{map};
		String retString = HproseClinetService.synCall(APIConstants.PERMMI_GETRIGHTSBYPLATID, arguments, APIConstants.AUTH_HOST, APIConstants.AUTH_PORT);
		if("服务不可用".equals(retString)){
			Logger.info("服务不可用");
		}else{
			JSONObject json = JSONObject.parseObject(retString);
			if(json!=null){
				if(Convert.convertToInt(json.getString("ret"), -1)<0){
					//失败
					Logger.error("查询权限列表失败:"+json.getString("msg"));
				}else{
					//成功
					JSONArray retJson = parseRightsData(json);
					renderJSON(retJson);
				}
			}
		}
		
		renderJSON(ja.toJSONString());
	}
	/**
	 * 转换为权限数据
	 * @param json
	 * @return
	 * 2016年1月22日 下午12:01:40
	 * @auth huan208050@vip.qq.com
	 */
	private static JSONArray parseRightsData(JSONObject json){
		JSONArray ja= json.getJSONArray("data");
		/**
		 * 1.获取所有list
		 * 2.转换成model
		 * 3.循环model，遍历
		 */
		
//		List<JSONObject> temps = new ArrayList<JSONObject>();
		
//		for(int i=0;i<ja.size();i++){
//			JSONObject obj = (JSONObject)ja.get(i);
//			boolean open = true;
//			String icon = obj.getString("icon");
//			int sort_num = obj.getIntValue("sort_num");
//			String url = obj.getString("url");
//			int isModle = obj.getIntValue("isModle");
//			int parentId = obj.getIntValue("parentId");
//			long id = obj.getLongValue("id");
//			String name = obj.getString("name");
//			RightsModel rm = new RightsModel(name,open, 0, icon, sort_num, 0, url, isModle, parentId, id);
//			temps.add(rm);
//		}
		
		/**
		 * 
		 */
		JSONArray  tmp = new JSONArray();
		for(int i=0;i<ja.size();i++){
			
			JSONObject rm = ja.getJSONObject(i);
			rm.put("open", true);
			if(rm.getIntValue("parentId")==0){
				//父级菜单，不做处理
				JSONObject root = addRights(rm,ja);
				Logger.info("rm_"+i+"_"+root);
				tmp.add(root);
			}
		}
		
//		String  rets = JSONUtils.getJsonObj(tmp);
//		
//		Logger.info(rets);
//		
//		JSONObject all = JSONObject.parseObject(rets);
//		ja = all.getJSONArray("data");
		Logger.info("整合后的数据:"+tmp);
		return ja;
	}
	/**
	 * 标记已经选中的
	 * @param json
	 * @param checks
	 * @return
	 * 2016年1月22日 下午6:00:34
	 * @auth huan208050@vip.qq.com
	 */
	private static JSONArray parseRightsDataWithCheck(JSONObject json,JSONArray checks){
		JSONArray ja= json.getJSONArray("data");//所有菜单id
		JSONArray jaCopy = ja;
		/**
		 * 1.获取所有list
		 * 2.转换成model
		 * 3.循环model，遍历
		 */
		
//		List<JSONObject> temps = new ArrayList<JSONObject>();
		
//		for(int i=0;i<ja.size();i++){
//			JSONObject obj = (JSONObject)ja.get(i);
//			boolean open = true;
//			String icon = obj.getString("icon");
//			int sort_num = obj.getIntValue("sort_num");
//			String url = obj.getString("url");
//			int isModle = obj.getIntValue("isModle");
//			int parentId = obj.getIntValue("parentId");
//			long id = obj.getLongValue("id");
//			String name = obj.getString("name");
//			RightsModel rm = new RightsModel(name,open, 0, icon, sort_num, 0, url, isModle, parentId, id);
//			temps.add(rm);
//		}
		
		/**
		 * 
		 */
		ja= new JSONArray();
		for(int i=0;i<jaCopy.size();i++){
			//循环所有的菜单
			JSONObject jn = jaCopy.getJSONObject(i);
			for(int j=0;j<checks.size();j++){
				JSONObject cs = checks.getJSONObject(j);
				if(cs.getString("rightsId").trim().equals(jn.getString("id").trim())){
					jn.put("checkbox", true);
					jn.put("checked", true);
					Logger.info(jn.getLong("id")+"");
				}
			}
			ja.add(jn);
		}
		
		JSONArray  tmp = new JSONArray();
		for(int i=0;i<ja.size();i++){
			JSONObject rm = ja.getJSONObject(i);
			if(rm.getIntValue("parentId")==0){
				//父级菜单，不做处理
				JSONObject root = addRights(rm,ja);
				tmp.add(root);
			}
		}
		
//		String  rets = JSONUtils.getJsonObj(tmp);
//		
		Logger.info(ja.toJSONString());
//		
//		JSONObject all = JSONObject.parseObject(rets);
//		ja = all.getJSONArray("data");
		return ja;
	}
	
	private static JSONObject addRights(JSONObject root,JSONArray temps){
		/**
		 * 1.查找所有子集
		 * 2.将子集存入data中
		 */
//		List<RightsModel> tmp = new ArrayList<RightsModel>();
		JSONArray tmp = new JSONArray();
		for(int i=0;i<temps.size();i++){
			JSONObject rm = temps.getJSONObject(i);
			if(rm.getIntValue("parentId")==root.getIntValue("id")){
				tmp.add(rm);
			}
		}
		
		for(int i=0;i<tmp.size();i++){
			addRights(tmp.getJSONObject(i), temps);
		}
		root.put("data", tmp);
		return root;
	}
	
	public static void addRoleAndRights(){
		Logger.info("in add roles ");
		//String t = params.get("tableValues");
		//Logger.info(ps+"_"+t);
		String roleName = params.get("roleName");
		String rs = params.get("rights");
	//	JSONArray ja = JSONArray.parseArray(t);
	//	StringBuffer buff = new StringBuffer();
//		for(int i=0;i<ja.size();i++){
//			JSONObject json = ja.getJSONObject(i);
//			String id = json.getString("id");
//			String c= Convert.convertToStr(json.get("checked")+"", "false");
//			if("true".equals(c)){
//				if(i==0){//第一个
//					buff.append(id);
//				}else{
//					buff.append(",").append(id);
//				}
//			}
//			/*int check = Convert.convertToInt(json.get("checkbox")+"", -1);
//			if(check>0){
//				if(i==0){//第一个
//					buff.append(id);
//				}else{
//					buff.append(",").append(id);
//				}
//			}*/
//		}
		String customer_id=UserBis.currUser();
		String operator_id = UserBis.currOperatorId();
		
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("customer_id", customer_id);
		map.put("operator_id", operator_id);
		map.put("rights", rs.substring(1, rs.length()-1));
		map.put("role_name", roleName);
		map.put("plat_id", UserBis.currPlatId());
		Object[] arguments = new Object[]{map};
		LogsUtils.addLogs(Constants.LOG_TYPE_ADD,Convert.convertToInt(UserBis.currOperatorId(),-1), 1, "执行系统角色添加","success", UserBis.currLoginAccount(), UserBis.currUserName(), UserBis.currUser());
		String ret = HproseClinetService.synCall(APIConstants.ROLEMI_ADDROLE, arguments,APIConstants.AUTH_HOST, APIConstants.AUTH_PORT);
		if("服务不可用".equals(ret)){
			renderJSON("");
		}else{
			JSONObject json = JSONObject.parseObject(ret);
			Logger.info(json.toJSONString());
			renderJSON(json);
		}
	}
	/**
	 * 编辑角色的权限
	 * 
	 * 2016年2月18日 下午3:45:36
	 * @auth huan208050@vip.qq.com
	 */ 
	public static void editRoleAndRights(){
		Logger.info("in edit roles ");
		Logger.info("in add roles ");
		String roleName = params.get("roleName");
		String rs = params.get("rights");
		/*JSONArray ja = JSONArray.parseArray(t);
		StringBuffer buff = new StringBuffer();
		int start = 0;
		for(int i=0;i<ja.size();i++){
			JSONObject json = ja.getJSONObject(i);
			String id = json.getString("id");
			int check = Convert.convertToInt(json.get("checkbox")+"", -1);
			String checkTrue = Convert.convertToStr(json.get("checkbox")+"","false");
			if(check>0||"true".equals(checkTrue)){
				if(start==0){//第一个
					buff.append(id);
				}else{
					buff.append(",").append(id);
				}
				start++;
			}
		}*/
		String customer_id=UserBis.currUser();
		String operator_id = UserBis.currOperatorId();
		
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("customer_id", customer_id);
		map.put("operator_id", operator_id);
		rs = rs.substring(1, rs.length()-1);
		map.put("rights", rs);
		map.put("role_name", roleName);
		map.put("role_id",params.get("roleId"));
		Object[] arguments = new Object[]{map};
		LogsUtils.addLogs(Constants.LOG_TYPE_UPDATE,Convert.convertToInt(UserBis.currOperatorId(),-1), 1, "执行系统角色添加","success", UserBis.currLoginAccount(), UserBis.currUserName(), UserBis.currUser());
		String ret = HproseClinetService.synCall(APIConstants.ROLEMI_EDITROLE, arguments,APIConstants.AUTH_HOST, APIConstants.AUTH_PORT);
		if("服务不可用".equals(ret)){
			renderJSON("");
		}else{
			JSONObject json = JSONObject.parseObject(ret);
			Logger.info(json.toJSONString());
			renderJSON(json);
		}
	}
	public static void getRightsListByRoleId(){
		JSONArray ja = new JSONArray();
		JSONObject json1 = new JSONObject();
		JSONObject json2 = new JSONObject();
		json1.put("leve", "leve1");
		json1.put("permissions", "服务不可用");
		json1.put("open", "true");
		json1.put("checkbox", 1);
		
		ja.add(json1);
		ja.add(json2);
		
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("operator_id", UserBis.currOperatorId());
		map.put("plat_id", UserBis.currPlatId());
		String role_id = params.get("role_id");
		map.put("role_id", role_id);
		Object[] arguments = new Object[]{map};
		String retString = HproseClinetService.synCall(APIConstants.PERMMI_GETRIGHTSBYPLATID, arguments, APIConstants.AUTH_HOST, APIConstants.AUTH_PORT);
		//获取当前角色对应的权限id
		Map<String, Object> currentMap = new HashMap<String, Object>();
		currentMap.put("role_id", role_id);
		Object[] arguments2 = new Object[]{currentMap};
		String crStr = HproseClinetService.synCall(APIConstants.RRMI_GETRIGHTSBYROLEID, arguments2, APIConstants.AUTH_HOST, APIConstants.AUTH_PORT);
		JSONObject crJson = JSONObject.parseObject(crStr);
		String currentRights = crJson.getString("data");
		String[] crs = currentRights.split(",");
		JSONArray checks = new JSONArray();
		Arrays.sort(crs);
		for(String s : crs){
			JSONObject c1=new JSONObject();
			c1.put("rightsId", s);
			checks.add(c1);
		}
		
		if("服务不可用".equals(retString)){
			Logger.info("服务不可用");
		}else{
			JSONObject json = JSONObject.parseObject(retString);
			if(json!=null){
				if(Convert.convertToInt(json.getString("ret"), -1)<0){
					//失败
					Logger.error("查询权限列表失败:"+json.getString("msg"));
				}else{
					//成功
					String retJson = JSON.toJSONString(parseRightsDataWithCheck(json,checks),SerializerFeature.DisableCircularReferenceDetect);
					Logger.info("role_right:"+retJson);
					renderJSON(retJson);
				}
			}
		}
		
		renderJSON(ja.toJSONString());
	}
	
	/**
	 * 通过roleid获取role的详细信息，包括role的基础信息，以及该role的权限信息
	 * 
	 * 2016年2月17日 上午10:05:16
	 * @auth huan208050@vip.qq.com
	 */
	public static void getRoleInfoById(){
		String id = params.get("id");
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("id", id);
		Object[] arguments = new Object[] { map };
		String res = HproseClinetService.synCall(APIConstants.ROLEMI_GETROLEINFOBYID, arguments,APIConstants.AUTH_HOST, APIConstants.AUTH_PORT);
		JSONObject json = JSONObject.parseObject(res);
		Logger.info("getRole-->"+json);
		renderJSON(json);
	}
	/**
	 * 修改角色状态
	 * 
	 * 2016年2月19日 下午2:31:23
	 * @auth huan208050@vip.qq.com
	 */
	public static void changeRoleStatus(){
		String role_id = params.get("role_id");
		String status = params.get("status");
		Map<String, Object> map = new HashMap<String, Object>();
		JSONArray ja = new JSONArray();
		JSONObject json = new JSONObject();
		json.put("role_id", role_id);
		json.put("status", status);
		ja.add(json);
		map.put("roles", ja.toString());
		Object[] arguments = new Object[] { map };
		LogsUtils.addLogs(Constants.LOG_TYPE_UPDATE,Convert.convertToInt(UserBis.currOperatorId(),-1), 1, "执行系统角色修改","success", UserBis.currLoginAccount(), UserBis.currUserName(), UserBis.currUser());
		String res = HproseClinetService.synCall(APIConstants.ROLEMI_CHANGEROLESTATE, arguments,APIConstants.AUTH_HOST, APIConstants.AUTH_PORT);
		JSONObject resJSON = JSONObject.parseObject(res);
		Logger.info("getRole-->"+resJSON);
		renderJSON(resJSON);
	}
	
	
	
	
	
	
	
	
	
	
	
}
